from . import passport_blue
import re,random
from ihome.libs.yuntongxun import sms
from flask import request,jsonify,current_app,make_response,session,g

from ihome.utils.response_code import RET
from ihome.utils.captcha.captcha import captcha
from ihome import redis_store,constants
from ihome import db
from ihome.models import User
from datetime import datetime


@passport_blue.route('/imagecode',methods=['GET'])
def image_code():
    """贾贺"""
    """
    获取图片验证码
    1.获取参数uuid
    2.判断uuid是否存在
    3.调用扩展生成图片验证码
    4.存储图片验证码在redis中
    5.返回图片验证码
    """
    # 1.获取参数uuid
    cur = request.args.get("cur")
    # 2.判断uuid是否存在
    if not cur:
        return jsonify(errno=RET.DBERR,errmsg='参数错误')
    # 3.调用扩展生成图片验证码
    name, text, image = captcha.generate_captcha()
    # 在redis中缓存图片验证码的text
    try:
        redis_store.setex('Imagecode_' + cur, constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='数据保存失败')
    # 5.返回图片验证码
    else:
        # 如果保存成功，返回图片
        response = make_response(image)
        # 修改响应报文的类型
        response.headers['Content-Type'] = 'image/jpg'
        return response


@passport_blue.route('/smscode',methods=['POST'])
def sms_code():
    """贾贺"""
    """
    获取短信验证码
    1.获取参数
    2.检查参数的完整性
    3.检测手机号码的格式是否正确
      判断手机是否注册
    4.尝试从redis中获取图片验证码的真实内容
    5.判断拿到的数据是否为空，如果为空，直接return返回
    6.删除redis中缓存的验证码
    7.比较图形验证码，忽视大小写
    8.生成随机数
    9.保存短信验证码内容
    10.调用第三方发送短信
    11.保存发送结果，用来返回前端发送结果
    12.返回结果 成功或失败
    """
    # 获取参数
    mobile = request.json.get('mobile')
    image_code = request.json.get('image_code')
    image_code_id = request.json.get('image_code_id')
    # 检查参数的完整性
    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    # 检测手机号码的格式是否正确
    if not re.match(r"1[3-9]\d{9}$",mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机格式错误')
    # 尝试从redis中获取图片验证码的真实内容
    try:
        real_image_code = redis_store.get('Imagecode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='获取数据失败')
    # 判断拿到的数据是否为空，如果为空，直接return返回
    if not real_image_code:
        return jsonify(errno=RET.NODATA,errmsg='数据已失效')
    # 删除redis中缓存的验证码
    try:
        redis_store.delete('ImageCode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
    # 比较图形验证码，忽视大小写
    if real_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR,errmsg='图形验证码错误')
    # 判断用户是否注册
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据失败')
    else:
        if user:
            return jsonify(errno=RET.DATAEXIST,errmsg='手机号已被注册')
    # 生成随机数
    sms_code = '%06d' % random.randint(0,999999)
    print(sms_code)
    # 保存短信验证码内容
    try:
        redis_store.setex('SMS_' + mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    except Exception as e:
        current_app.logger(e)
        return jsonify(errno=RET.DBERR,errmsg='保存数据失败')
    # 调用第三方发送短信
    try:
        ccp = sms.CCP()
        result = ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg='发送短信异常')
    # 判断result的发送结果,返回结果
    if result == 0:
        return jsonify(errno=RET.OK,errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR,errmsg='发送失败')


@passport_blue.route('/user',methods=['POST'])
def register():
    """贾贺"""
    """
    注册
    """
    # 获取参数
    mobile = request.json.get('mobile')
    phonecode = request.json.get('phonecode')
    password = request.json.get('password')
    # 检查参数
    if not all([mobile,phonecode,password]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    # 检查手机格式
    if not re.match(r'1[3-9]\d{9}$',mobile):
        return jsonify(errno=RET.PARAMERR,errmsg='手机号格式错误')
    # redis中获取短信验证码
    try:
        real_sms_code = redis_store.get('SMS_' + mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据失败')
    # 判断获取结果是否过期
    if not real_sms_code:
        return jsonify(errno=RET.NODATA,errmsg='数据已过期')
    # 检查短信验证码是否正确
    if real_sms_code != phonecode:
        return jsonify(errno=RET.DATAERR,errmsg='短信验证码错误')
    # 删除短信验证码
    try:
        redis_store.delete('SMS_' + mobile)
    except Exception as e:
        current_app.logger.error(e)
    # 判断用户是否注册
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据失败')
    else:
        if user:
            return jsonify(errno=RET.DATAEXIST,errmsg='手机号已注册')
    # 保存数据
    user = User()
    user.mobile = mobile
    user.name = mobile
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg='数据保存失败')
    # 缓存用户信息
    session['user_id'] = user.id
    session['mobile'] = user.mobile
    session['name'] = user.name
    return jsonify(errno=RET.OK,errmsg='OK')




@passport_blue.route('/session',methods=['GET','POST','DELETE'])
def login():
    if request.method=='POST':
        mobile = request.json.get('mobile')
        password = request.json.get('password')
        if not all([mobile, password]):
            return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
        if not re.match(r'1[3456789]\d{9}$', mobile):
            return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')
        try:
            user = User.query.filter_by(mobile=mobile).first()
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg='查询用户数据失败')
        if not user or not user.check_passowrd(password):
            return jsonify(errno=RET.DATAERR,errmsg='用户名或密码错误')
        user.last_login = datetime.now()
        # 更新缓存信息
        session['name'] = mobile
        session['mobile'] = mobile
        session['user_id'] = user.id
        return jsonify(errno=RET.OK, errmsg='OK')
    # 获取用户状态信息
    if request.method=='GET':
        name=session.get('name')
        user_id=session.get('user_id')
        if all([name,user_id]):
            data={
                'name':name,
                'user_id':user_id
            }
            return jsonify(errno=RET.OK,errmsg='OK',data=data)

        else:
            return jsonify(errno=RET.DATAERR,errmsg='用户未登录')

    if request.method == 'DELETE':
        session.pop('mobile', None)
        session.pop('name', None)
        session.pop('password', None)
        return jsonify(errno=RET.OK, errmsg='OK')

